package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import org.sysdance.aplicativo.entidade.Curso;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.CursoIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.ResultSetUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;

public class CursoDAO implements CursoIntegracao {

	@Override
	public void inserirNovoCurso(Curso curso) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO curso(id_curso, nm_curso, vlr_total_curso, dt_inicio_curso, dt_fim_curso, idade_min_curso) ");
        sql.append("VALUES (NEXTVAL('curso_id_curso_seq'), ?, ?, ?, ?, ?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, curso.getNmCurso());
            ps.setDouble(2, curso.getVlrTotalCurso().doubleValue());
            ps.setDate(3, new Date(curso.getDtInicioCurso().getTime()));
            ps.setDate(4, new Date(curso.getDtFimCurso().getTime()));
            ps.setInt(5, curso.getIdadeMinCurso());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}
	
	@Override
	public Collection<Curso> consultarTodosCursos() {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM curso;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            return ResultSetUtil.extrair(ps.executeQuery(), Curso.class);
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return new LinkedList<Curso>();
	}

	@Override
	public Curso consultarCursoPorId(Integer idCurso) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM curso WHERE id_curso =?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, idCurso);
            return ResultSetUtil.extrairUnicoRegistro(ps.executeQuery(), Curso.class);
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
		return null;
	}
	
	@Override
	public void atualizarDadosCurso(Curso curso) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE curso SET vlr_total_curso=?, dt_inicio_curso=?, dt_fim_curso=? ");
        sql.append("WHERE id_curso=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setBigDecimal(1, curso.getVlrTotalCurso());
            ps.setDate(2, new Date(curso.getDtInicioCurso().getTime()));
            ps.setDate(3, new Date(curso.getDtFimCurso().getTime()));
            ps.setInt(4, curso.getIdCurso());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}

}
